var obj = new Proxy({}, {
    get: function (target, key, receiver) {
        console.log(`getting ${key}!`);
        return Reflect.get(target, key, receiver);
    },
    set: function (target, key, value, receiver) {
        console.log(`setting ${key}!`);
        return Reflect.set(target, key, value, receiver);
    }
});

obj.count = 1;  // 运行此句会输出 setting count!
++obj.count;
//  getting count!
//  setting count!


//Proxy 实例也可以作为其他对象的原型对象。
var proxy = new Proxy({}, {
    get: function(target, property) {
        return 35;
    }
});

let obj1 = Object.create(proxy);
console.log(obj1.time); // 35


//对于可以设置、但没有设置拦截的操作，则直接落在目标对象上，按照原先的方式产生结果。
//
// （1）get(target, propKey, receiver)
//
// 拦截对象属性的读取，比如proxy.foo和proxy['foo']。
//
// 最后一个参数receiver是一个对象，可选，参见下面Reflect.get的部分。
//
// （2）set(target, propKey, value, receiver)
//
// 拦截对象属性的设置，比如proxy.foo = v或proxy['foo'] = v，返回一个布尔值。
//
// （3）has(target, propKey)
//
// 拦截propKey in proxy的操作，返回一个布尔值。
//
// （4）deleteProperty(target, propKey)
//
// 拦截delete proxy[propKey]的操作，返回一个布尔值。
//
// （5）ownKeys(target)
//
// 拦截Object.getOwnPropertyNames(proxy)、Object.getOwnPropertySymbols(proxy)、Object.keys(proxy)，返回一个数组。该方法返回目标对象所有自身的属性的属性名，而Object.keys()的返回结果仅包括目标对象自身的可遍历属性。
//
// （6）getOwnPropertyDescriptor(target, propKey)
//
// 拦截Object.getOwnPropertyDescriptor(proxy, propKey)，返回属性的描述对象。
//
// （7）defineProperty(target, propKey, propDesc)
//
// 拦截Object.defineProperty(proxy, propKey, propDesc）、Object.defineProperties(proxy, propDescs)，返回一个布尔值。
//
// （8）preventExtensions(target)
//
// 拦截Object.preventExtensions(proxy)，返回一个布尔值。
//
// （9）getPrototypeOf(target)
//
// 拦截Object.getPrototypeOf(proxy)，返回一个对象。
//
// （10）isExtensible(target)
//
// 拦截Object.isExtensible(proxy)，返回一个布尔值。
//
// （11）setPrototypeOf(target, proto)
//
// 拦截Object.setPrototypeOf(proxy, proto)，返回一个布尔值。
//
// 如果目标对象是函数，那么还有两种额外操作可以拦截。
//
// （12）apply(target, object, args)
//
// 拦截 Proxy 实例作为函数调用的操作，比如proxy(...args)、proxy.call(object, ...args)、proxy.apply(...)。
//
// （13）construct(target, args)
//
// 拦截 Proxy 实例作为构造函数调用的操作，比如new proxy(...args)。